﻿/*****************************************************************//**
* @file   FITKAbstractVAOneXMLAdaptor.h
* @brief  VAOne XML的读写适配器基类
*
* @author TanDongYang
* @date   2024-10-16
*********************************************************************/

#ifndef FITKABSTRACTVAONEADAPTOR_H
#define FITKABSTRACTVAONEADAPTOR_H

#include "FITKVAOneXMLIOAPI.h"
#include "FITKAbstractVAOneXMLHelper.h"
#include <QObject>

namespace rapidxml
{
template<class Ch>
class xml_node;
}

namespace Acoustics
{
class FITKAcousticsPhysics;
}

namespace IO {

    /**
    * @brief   VAOne XML的读写适配器基类
    * @author  TanDongYang (tandongyang@diso.cn)
    * @date    2024-10-16
    */
    class FITKVAOneXMLIOAPI FITKAbstractVAOneXMLAdaptor :public QObject ,public FITKAbstractVAOneXMLHelper
    {
    FITKCLASS(IO, FITKAbstractVAOneXMLAdaptor);
    public:
        /**
        * @brief   Construct a new FITKAbstractVAOneXMLAdaptor object
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        explicit FITKAbstractVAOneXMLAdaptor() = default;

        /**
        * @brief   Destroy the FITKAbstractVAOneXMLAdaptor object
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        virtual ~FITKAbstractVAOneXMLAdaptor() = default;

        /**
        * @brief   获取节点
        * @return  节点指针
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        rapidxml::xml_node<char>* getNode() const { return _node; }

        /**
        * @brief   设置节点
        * @param   val         节点指针
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        void setNode(rapidxml::xml_node<char>* val) { _node = val; }

    protected:

        /**
        * @brief 打印控制台消息
        * @param[i] level 打印级别 1 normal 2 warning 3error
        * @param[i] str 数据
        * @author TanDongYang
        * @date 2024-11-05
        */
        virtual void consoleMessage(int level, const QString& str);

        /**
        * @brief   读取属性值
        * @param   node        对应节点
        * @param   attrName    属性名称
        * @param   isOk        数据状态
        * @return  字符串类型的数据
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        QString readStrAttribute(rapidxml::xml_node<char>* node, QString attrName, bool* isOk);

        /**
        * @brief   读取属性值
        * @param   node        对应节点
        * @param   attrName    属性名称
        * @param   isOk        数据状态
        * @return  整型的数据
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        int readIntAttribute(rapidxml::xml_node<char>* node, QString attrName, bool* isOk);

        /**
        * @brief   读取属性值
        * @param   node        对应节点
        * @param   attrName    属性名称
        * @param   isOk        数据状态
        * @return  双浮点的数据
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        double readDoubleAttribute(rapidxml::xml_node<char>* node, QString attrName, bool* isOk);

        /**
        * @brief   读取属性值
        * @param   node        对应节点
        * @param   attrName    属性名称
        * @param   isOk        数据状态
        * @return  单浮点的数据
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        float readFloatAttribute(rapidxml::xml_node<char>* node, QString attrName, bool* isOk);

        /**
        * @brief   写入属性值
        * @param   node        对应节点
        * @param   attrName    属性名称
        * @param   value       字符串数值
        * @return  写入状态
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        bool writeAttribute(rapidxml::xml_node<char>* node, QString attrName, QString value);

        /**
        * @brief   写入属性值
        * @param   node        对应节点
        * @param   attrName    属性名称
        * @param   value       整型数值
        * @return  写入状态
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        bool writeAttribute(rapidxml::xml_node<char>* node, QString attrName, int value);

        /**
        * @brief   写入属性值
        * @param   node        对应节点
        * @param   attrName    属性名称
        * @param   value       双浮点数值
        * @return  写入状态
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        bool writeAttribute(rapidxml::xml_node<char>* node, QString attrName, double value);

        /**
        * @brief   写入属性值
        * @param   node        对应节点
        * @param   attrName    属性名称
        * @param   value       单浮点数值
        * @return  写入状态
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        bool writeAttribute(rapidxml::xml_node<char>* node, QString attrName, float value);

        /**
        * @brief   读取节点数据
        * @param   node    对应节点
        * @param   isOk    读取状态
        * @return  字符串类型的节点数据
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        QString readStrNodeValue(rapidxml::xml_node<char>* node, bool* isOk);

        /**
        * @brief   读取节点数据
        * @param   node    对应节点
        * @param   isOk    读取状态
        * @return  整型的节点数据
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        int readIntNodeValue(rapidxml::xml_node<char>* node, bool* isOk);

        /**
        * @brief   读取节点数据
        * @param   node    对应节点
        * @param   isOk    读取状态
        * @return  双浮点型的节点数据
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        double readDoubleNodeValue(rapidxml::xml_node<char>* node, bool* isOk);

        /**
        * @brief   读取节点数据
        * @param   node    对应节点
        * @param   isOk    读取状态
        * @return  单浮点型的节点数据
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        float readFloatNodeValue(rapidxml::xml_node<char>* node, bool* isOk);

        /**
        * @brief   创建节点子元素
        * @param   parentNode  父节点
        * @param   childName   子元素名称
        * @param   value       字符串类型的元素数据
        * @return  子元素节点
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        rapidxml::xml_node<char>* createNodeElement(rapidxml::xml_node<char>* parentNode, QString childName, QString value = "");

        /**
        * @brief   创建节点子元素
        * @param   parentNode  父节点
        * @param   childName   子元素名称
        * @param   value       整型的元素数据
        * @return  子元素节点
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        rapidxml::xml_node<char>* createNodeElement(rapidxml::xml_node<char>* parentNode, QString childName, int value);

        /**
        * @brief   创建节点子元素
        * @param   parentNode  父节点
        * @param   childName   子元素名称
        * @param   value       双浮点型的元素数据
        * @return  子元素节点
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        rapidxml::xml_node<char>* createNodeElement(rapidxml::xml_node<char>* parentNode, QString childName, double value);

        /**
        * @brief   创建节点子元素
        * @param   parentNode  父节点
        * @param   childName   子元素名称
        * @param   value       单浮点型的元素数据
        * @return  子元素节点
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        rapidxml::xml_node<char>* createNodeElement(rapidxml::xml_node<char>* parentNode, QString childName, float value);

        /**
        * @brief 根据获取颜色值
        * @param[i] node 颜色节点
        * @param[o] float 颜色值 r、g、b； 根据xml内容，小于等于1
        * @author liuzhiiyuan
        * @date 2024-10-18
        */
        void readColorNodeValue(rapidxml::xml_node<char>* node, float &r, float &g, float &b);

        /**
        * @brief   _node   XML节点指针
        * @author  TanDongYang (tandongyang@diso.cn)
        * @date    2024-10-16
        */
        rapidxml::xml_node<char>* _node{};
        /**
        * @brief 将 QString 转换为 char*-（该函数后期会修改）
        * @param[in] qStr 要转换的 QString 对象
        * @return char* 返回指向动态分配的 char* 字符串
        * @throws std::runtime_error 如果字符串复制失败
        * @author XingXuanCi (xingxuanci@diso.cn)
        * @date 2024-10-18
        */
        char* copyQStringToChar(const QString& qStr);


        /**
        * @brief   获取子节点文本 <thisNode><Name>FE-1</Name></thisNode>
        * @param   node    父节点 thisNode
        * @param   name    对应子节点名称， 比如"Name"
        * @return  获取节点文本, 如 "FE-1"
        * @author  lishun (lishun@diso.cn)
        * @date    2024-11-21
        */
        QString getChildElementText(rapidxml::xml_node<char>* node, QString name);
        //        /**
        //         * @brief 获取物理管理类
        //         * @return Acoustics::FITKAcousticsPhysics* 物理管理类
        //         * @author liuzhiiyuan
        //         * @date 2024-10-18
        //         */
        //        Acoustics::FITKAcousticsPhysics* getPhysicsData();


        //        /**
        //         * @brief 根据声包名称获取声包id
        //         * @param[i] name 声包名称
        //         * @return int 声包id 无则返回-1
        //         * @author liuzhiiyuan
        //         * @date 2024-10-18
        //         */
        //        int getAcousticsObjectIdByName(QString name);

        //    private:
        //        Acoustics::FITKAcousticsPhysics* _physics{};

    };

}
#endif // FITKABSTRACTVAONEADAPTOR_H
